using IQIGame.Onigao.Game;
using IQIGame.Onigao.GamePlay;
using NetProtocol.Enum;
using System.Collections.Generic;

namespace IQIGame.Onigao.Logic
{
    /// <summary>
    /// 改变英雄或队伍的血量（增量）
    /// </summary>
    public class ExecAddHp : BaseServiceExecution
    {
        public enum TargetType
        {
            TeamLeader = 1,
            AllTeam = 2,

            Max = 3
        }

        public enum AddHpType
        {
            FixValue = 1,
            Percent = 2,

            Max = 3
        }

        public override void Execute(LevelRegion region, LevelPlayer player)
        {
            if (player == null)
            {
                //修改HP目前只能修改英雄，所以必须要指定触发的玩家，但由于多人存在，没有约定查找指定玩家的方案，所以只能找到自己
                //基于上述原因，该执行只能由玩家触发，不能由实体自动触发，才能获得player参数
                LogicLog.LogError("修改HP目前必须由玩家触发，而不能由关卡或实体自动触发。");
                return;
            }
            if (player.isTeamWipe)
            {
                //已经团灭，不能再修改hp
                return;
            }
            ExecParamAddHp config = _config as ExecParamAddHp;
            if (!isValidTargetType(config.targetType) || !isValidAddType(config.addType))
            {
                LogicLog.LogError("参数非法，目标类型错误或添加类型错误。");
                return;
            }
            List<LevelHero> heroes = ListPool<LevelHero>.Get();
            {
                if ((TargetType)config.targetType == TargetType.TeamLeader)
                {
                    heroes.Add(player.leaderHero);
                }
                else
                {
                    foreach (var hero in player.heroes)
                    {
                        heroes.Add(hero);
                    }
                }

                foreach (var hero in heroes)
                {
                    hero.AddHp(config.addValue, (AddHpType)config.addType == AddHpType.Percent);
                }
                region.NotifyHeroesAttr(player, heroes, config.isPlayHit ? AttrChangeReason.UnderAttack : AttrChangeReason.Default);
                player.CheckTeamHP();
            }
            ListPool<LevelHero>.Put(heroes);
        }

        private bool isValidTargetType(int value)
        {
            if (value <= 0)
            {
                return false;
            }
            if (value >= (int)TargetType.Max)
            {
                return false;
            }
            return true;
        }

        private bool isValidAddType(int value)
        {
            if (value <= 0)
            {
                return false;
            }
            if (value >= (int)AddHpType.Max)
            {
                return false;
            }
            return true;
        }
    }
}
